/**
 @file md25.h
 @brief Declaración  de contantes y api de funciones para el manejo de los motores EMG30 con reductora 36:1 y una controladora MD25.
 @date Agosors, 2011
 @author José Delgado Pérez josedelgado@ula.ve josed43@gmail.com

 Algunos datos: La controladora MD25 funciona bajo dos estandares de comunicacion Serial e I2C.
		Permite el control de dos motores, y esta diseñada especialmente para el control de moteres EMG30.
		Las declaración  de contantes y api de funciones desarrolladas a continuacion representas el control 
		del la placa MD25 en lenguaje C con comunicacion I2C usando un circuito interfaz USB-I2C S310425 
		que utiliza el chip USB FTDI FT232R.
		Los controladores de este chip pueden descargarce de http://www.ftdichip.com/Products/ICs/FT232R.htm
		pero ya vienen incluidos en el kernel de linux a partir de la version 2.6. 
*/

#ifndef MD25H
#define MD25H

/*************DEFINICIONES**************/

// Puerto de conexion del controlador de motores.
#define PUERTODISPOSITIVO "/dev/ttyUSB0"
				
//comando de comunicacion con dispocitivo usbToI2c.
#define USB_I2C_CMD 0x5A			

//comando del dispositivo usbToI2c que permite (Lectura/escritura) en dispositivos con registro interno.
#define I2C_CMD 0x55

//Posicion del banco de registro.
#define	MD25_W 0xB0		

//Posicion del banco de registro mas bit de escritura.
#define	MD25_R 0xB1		

//Tamaño del retraso para la comunicacion con MD25.
#define RETRASO 7800

//***********Banco de Registro*********//

//Registro de velocidad 1 (Lectura/escritura).
#define REGISTRO_0 0

//Registro de velocidad 2 (Lectura/escritura).			
#define REGISTRO_1 1

//Registro de incial codificadores del motor1 (Lectura).				
#define REGISTRO_2 2			

//Registro de incial codificadores del motor2 (Lectura).	
#define REGISTRO_6 6

//Registro voltaje de salida de la bateria (Lectura).
#define REGISTRO_10 10				

//Registro corriente administrada al motor 1 (Lectura).
#define REGISTRO_11 11

//Registro corriente administrada al motor 1 (Lectura).
#define REGISTRO_12 12

//Registro de vercion del software (Lectura).
#define REGISTRO_13 13

//Registro de modo de aceleracion (Lectura/escritura).			
#define REGISTRO_14 14

//Registro de velocidad de la controladora (Lectura/escritura).
#define REGISTRO_15 15

//Registro de comandos de configuracion de la controladora (Lectura/escritura).
#define REGISTRO_16 16
		
//***********Comandos de la controladora*********//

//Pone a cero los registros del codificador.
#define REINICIO_CODIFICADORES 0x20

//Desactiva la regulación automática de velocidad.
#define DESAVTIVAR_AUTO_VELOCIDAD 0x30

//Activa la regulación automática de velocidad (por defecto).
#define AVTIVAR_AUTO_VELOCIDAD 0x31 		

//Desactiva el tiempo de inactividad de 2 segundos de los motores.
#define DESAVTIVAR_MODO_SEGURIDAD 0x32

//Activa el tiempo de inactividad de 2 segundos de los motores (por defecto).
#define AVTIVAR_MODO_SEGURIDAD 0x33

/***********Funiones de comnicacion serial**************/

/**
 @brief apertura del puerto de comunicacion serial.
 @param fd puntero a la direcciones de memoria a la variable que almacena el numero del puerto.
 @return 0 operacion exitosa en caso contrario.
	-1 Error: No se logro abrir el puerto de comunicacion con el dispocitivo. 
*/
int abrirPuerto(int *fd);

/**
 @brief clausura del puerto de comunicacion serial.
 @param fd numero del puerto de comunicacion.
 @return 0 operacion exitosa en caso contrario.
	-1 Error: No se logro cerrar el puerto de comunicacion con el dispocitivo. 
*/
int cerrarPuerto(int fd);

/**
 @brief escribir datos por el puerto serial.
 @param fd numero del puerto de comunicacion.
 @param nBytes numeros de datos a escribir.
 @param sbuf puntero a la direcciones de memoria al buffer que contiene los datos a escribir.
 @return 0 operacion exitosa en caso contrario.
	-1 Error no se lograron escribir los datos.
	-2 Error solo se escribieron #bytes de #nBytes.
*/
int escribirDatos(int fd, int nBytes, unsigned char *sbuf);

/**
 @brief leer datos por el puerto serial.
 @param fd numero del puerto de comunicacion.
 @param nBytes numeros de datos a leer.
 @param sbuf puntero a la direcciones de memoria al buffer que contiene los datos a leer.
 @return 0 operacion exitosa en caso contrario.
	-1 Error no se logro leer los datos.
	-2 Error solo se logro leer #bytes de #nBytes.
*/
int leerDatos(int fd, int nBytes, unsigned char *sbuf);

/******Funiones de manipulacion del controlador MD25******/

/**
 @brief establece un nuevo valor a el registro de velocidad 1 del controlador.
 @param fd numero del puerto de comunicacion.
 @param velocidad nuevo valor de velocidad.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al intentar escribir los datos de velocidad 1.
	-2 Error la escritura de la velocidad 1 no fue correcta.
*/
int asignarVelocidad1(int fd, double velocidad);

/**
 @brief optiene el valor del registro de velocidad 1 del controlador y actualiza el dato.
 @param fd numero del puerto de comunicacion.
 @param velocidad puntero a la direccion de memoria donde se encuentra el valor de la velocidad 1.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura para valor del registro de velocidad 1.
	-2 Error no se pudieron leer los datos de el registro de velocidad 1.
*/
int obtenerVelocidad1(int fd, double *velocidad);

/**
 @brief establece un nuevo valor a el registro de velocidad 2 del controlador.
 @param fd numero de puerto de comunicacion.
 @param velocidad nuevo valor de velocidad.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al intentar escribir los datos de velocidad 2.
	-2 Error la escritura de la velocidad 2 no fue correcta. 
*/
int asignarVelocidad2(int fd, double velocidad);

/**
 @brief optiene el valor del registro de velocidad 1 del controlador y actualiza su valor.
 @param fd numero del puerto de comunicacion.
 @param velocidad puntero a la direccion de memoria donde se encuentra el valor de la velocidad 1.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura para valor del registro de velocidad 2.
	-2 Error no se pudieron leer los datos de el registro de velocidad 2.
*/
int obtenerVelocidad1(int fd, double *velocidad);

/**
 @brief actualiza la posicion del condificador del motor 1.
 @param fd numero del puerto de comunicacion.
 @param posicion puntero a la direccion de memoria donde se encuentra el valor de la posicion del motor 1.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del valor codificador 1.
	-2 Error no se pudieron leer los datos de los registro del codificador 1.
*/
int obtenerCodificadorMotor1(int fd, int *posicion);

/**
 @brief actualiza la posicion del condificador del motor 2.
 @param fd numero del puerto de comunicacion.
 @param posicion puntero a la direccion de memoria donde se encuentra el valor de la posicion del motor 2.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del valor codificador 2.
	-2 Error no se pudieron leer los datos de los registro del codificador 2.
*/
int obtenerCodificadorMotor2(int fd, int *posicion);

/**
 @brief actualiza el valor del voltaje de la bateria.
 @param fd numero del puerto de comunicacion.
 @param voltaje puntero a la direccion de memoria donde se encuentra el valor del voltaje.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del valor del voltaje.
	-2 Error no se pudieron leer los datos de los registro del voltaje.
*/
int obtenerVolajeBateria(int fd, double *voltaje);

/**
 @brief actualiza el valor de la corriente suministrada al motor 1.
 @param fd numero del puerto de comunicacion.
 @param corriente puntero a la direccion de memoria donde se encuentra el valor de la corriente suministrada al motor 1.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del valor de la corriente del motor 1.
	-2 Error no se pudieron leer los datos de los registro de corriente del motor 1.
*/
int obtenerCorrienteMotor1(int fd, double *corriente);

/**
 @brief actualiza el valor de la corriente suministrada al motor 2.
 @param fd numero del puerto de comunicacion.
 @param corriente puntero a la direccion de memoria donde se encuentra el valor de la corriente suministrada al motor 2.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del valor de la corriente del motor 2.
	-2 Error no se pudieron leer los datos de los registro de corriente del motor 2.
*/
int obtenerCorrienteMotor2(int fd, double *corriente);

/**
 @brief actualiza el numero de la vercion del software del controlador.
 @param fd numero del puerto de comunicacion.
 @param vercion puntero a la direccion de memoria donde se encuentra la vercion del software.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura de la version del software.
	-2 Error no se pudo leer el registro que contiene la version del software.
*/
int obtenerNumeroVersion(int fd, double *version);

/**
 @brief establece un nuevo mode de aceleracion a la controladora.
 @param fd numero de puerto de comunicacion.
 @param modo nuevo modo de aceleracion.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al intentar escribir los datos del registro modo aceleracion.
	-2 Error la escritura del registro modo aceleracion no fue correcta. 
*/
int asignarModoAceleracion(int fd, int modo);

/**
 @brief actualiza el modo de aceleracion en que trabaja la controladora.
 @param fd numero de puerto de comunicacion.
 @param modo puntero a la direccion de memoria donde se encuentra el modo de aceleracion actual.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del modo de aceleracion.
	-2 Error no se pudo leer el registro que contiene el modo de aceleracion. 
*/
int obtenerModoAceleracion(int fd, int *modoAceleracion);

/**
 @brief establece un nuevo mode de velocidad de la controladora.
 @param fd numero de puerto de comunicacion.
 @param modo nuevo modo de velocidad.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al intentar escribir los datos del registro modo velocidad.
	-2 Error la escritura del registro modo velocidad no fue correcta. 
*/
int asignarModoVelocidad(int fd, int modoVelocidad);

/**
 @brief actualiza el modo de velocidad en que trabaja la controladora.
 @param fd numero de puerto de comunicacion.
 @param modo puntero a la direccion de memoria donde se encuentra el modo de velocidad actual.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al enviar la solicitud de lectura del modo de velocidad.
	-2 Error no se pudo leer el registro que contiene el modo de velocidad. 
*/
int obtenerModoVelocidad(int fd, int *modoVelocidad);

/**
 @brief enviar un comando a la controladora.
 @param fd numero de puerto de comunicacion.
 @param comando comando a enviar a la controladora.
 @return 0 operacion exitosa en caso contrario.
	-1 Error al intentar enviar un comando.
	-2 Error el comando no fue enviado con exito. 
*/
int enviarComando(int fd, unsigned char comando);

/***********************************************************************/

#endif

